package util.greedy;

import bean.Worker;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;

public class GSatisfy {

    /**
     * 此方法是用来判断当前团队team中的工人是否满足任务的技能需求
     * @param team 当前组建的团队
     * @param taskSkills 任务所需的技能
     * @return 如果当前team团队中的工人技能满足任务需求则返回true，否则返回false
     */
    public static boolean isGSatisfy(HashSet<Worker> team, HashSet<String> taskSkills) {
        /* 调试这个方法，一直返回false，
           因为W-w3后只剩下w1，w2，这一组，w1先进入team，w2无法满足要求，此team始终无法组队
           如果没法调试，就在他的调用方，做判断结束循环*/
        if (team.size()==0) {
            return false;
        }
        //把taskSkills放进一个新的集合中，以便于做删除操作
        HashSet<String> taskSkillsNew = new HashSet<>();
        Iterator<String> iteratorOfTaskSkills = taskSkills.iterator();
        while ( iteratorOfTaskSkills.hasNext() ) {
            taskSkillsNew.add(iteratorOfTaskSkills.next());
        }
        //遍历team中的每一个工人，判断技能是否满足任务需求，还有考虑工人capacity
        for (Worker w : team) {
            //把当前遍历的工人的技能放进数组wSkills中
            ArrayList<String> wSkills = new ArrayList<>();
            Iterator<String> iteratorOfWorkerSkills = w.getSkills().iterator();
            while (iteratorOfWorkerSkills.hasNext()) {
                wSkills.add(iteratorOfWorkerSkills.next());
            }
            //count用来标记工人的能力，如果工人技能中是任务所需的技能数量大于工人能力，则不再加入计算
            int capacity = w.getCapacity();
            int count = 0;
            f : for (String wSkill : wSkills) {
                Iterator<String> iterator = taskSkillsNew.iterator();
                while (iterator.hasNext()) {
                    if (wSkill == iterator.next()) {
                        if (count==capacity){
                            break f;
                        }
                        count++;
                        iterator.remove();
                    }
                }
//                for (String tSkill : taskSkillsNew) {
//                    if (wSkill == tSkill) {
//                        if (count==capacity){
//                            break f;
//                        }
//                        count++;
//                        //这样写会出现异常ConcurrentModificationException
//                        //解决方法是：使用Iterator提供的remove方法，用于删除当前元素
//                        taskSkillsNew.remove(wSkill);
//                    }
//                }
            }
        }
        //如果新的任务技能集合为空，则说明当前团队team中的工人满足任务需求
        if (taskSkillsNew.isEmpty()) {
            return true;
        }else {
            return false;
        }
    }
}
